/*
 * This code based on Silicon Graphics, Inc.'s redbook
 * http://www.opengl.org/resources/code/samples/redbook/
 */

/*
 * Copyright (C) 2008 aki@akjava.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * original code license
 * Copyright (c) 1993-1997, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED 
 * Permission to use, copy, modify, and distribute this software for 
 * any purpose and without fee is hereby granted, provided that the above
 * copyright notice appear in all copies and that both the copyright notice
 * and this permission notice appear in supporting documentation, and that 
 * the name of Silicon Graphics, Inc. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission. 
 *
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 * 
 * US Government Users Restricted Rights 
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 * clause at DFARS 252.227-7013 and/or in similar or successor
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 * Unpublished-- rights reserved under the copyright laws of the
 * United States.  Contractor/manufacturer is Silicon Graphics,
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 *
 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
 */

package com.akjava.android.openglsamples.redbook;

import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.content.Context;
import android.opengl.GLU;
import android.util.Log;

import com.akjava.android.openglsamples.GLUT;
import com.akjava.android.openglsamples.OpenGLUtils;


public class StencilRenderer extends RedBookSimpleRenderer {


	public StencilRenderer(Context context) {
       super(context);
    }


FloatBuffer yellow_diffuseBuffer;
FloatBuffer yellow_specularBuffer;
FloatBuffer blue_diffuseBuffer;
FloatBuffer blue_specularBufferr;
    public void setUpBuffers() {
    	
    	
		   float yellow_diffuse[] = { 0.7f, 0.7f, 0.0f, 1.0f };
		   float yellow_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

		   float blue_diffuse[] = { 0.1f, 0.1f, 0.7f, 1.0f };
		   float blue_specular[] = { 0.1f, 1.0f, 1.0f, 1.0f };
		   
		   yellow_diffuseBuffer=FloatBuffer.wrap(yellow_diffuse);
		   yellow_specularBuffer=FloatBuffer.wrap(yellow_specular);
		   blue_diffuseBuffer=FloatBuffer.wrap(blue_diffuse);
		   blue_specularBufferr=FloatBuffer.wrap(blue_specular);
		   
		   
		   mIndexBuffer = OpenGLUtils.allocateShortBuffer(1000);
		   mFVertexBuffer = OpenGLUtils.allocateFloatBuffer(1000);
	        
	        OpenGLUtils.addVertex3f(mFVertexBuffer, -1.0f, 0.0f,0);
	        OpenGLUtils.addVertex3f(mFVertexBuffer, 0,1,0);
	        OpenGLUtils.addVertex3f(mFVertexBuffer, 1,0,0);
	        OpenGLUtils.addVertex3f(mFVertexBuffer, 0,-1,0);
	        
	           OpenGLUtils.addIndex(mIndexBuffer,0,1,2);
			   OpenGLUtils.addIndex(mIndexBuffer,2,3,0);
			   
	        mFVertexBuffer.position(0);
	        mIndexBuffer.position(0);
	       
    }
    
	public void yellowMat(GL10 gl){
	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, yellow_diffuseBuffer);
	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, yellow_specularBuffer);
	   gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 64.0f);
}

	public void blueMat(GL10 gl){
	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, blue_diffuseBuffer);
	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, blue_specularBufferr);
	   gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 45.0f);
	}

    public void onSurfaceChanged(GL10 gl, int w, int h) {
    	 gl.glViewport(0, 0, w,  h);

    	  /* create a diamond shaped stencil area */
    	 gl.glMatrixMode(GL10.GL_PROJECTION);
    	 gl.glLoadIdentity();
    	     if (w <= h)
    	        GLU.gluOrtho2D(gl,-3.0f, 3.0f, -3.0f*(float)h/(float)w,
    	                   3.0f*(float)h/(float)w);
    	     else
    	        GLU.gluOrtho2D(gl,-3.0f*(float)w/(float)h,
    	                   3.0f*(float)w/(float)h, -3.0f, 3.0f);
    	     gl.glMatrixMode(GL10.GL_MODELVIEW);
    	     gl.glLoadIdentity();

    	     gl.glClear(GL10.GL_STENCIL_BUFFER_BIT);
    	     gl.glStencilFunc (GL10.GL_ALWAYS, 0x1, 0x1);
    	     gl. glStencilOp (GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE);
    	     
    	     //quad
    	        gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);
    	    	gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
    	    	gl.glDrawElements(GL10.GL_TRIANGLES, 6,
    	        GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
    	    	

    	     gl.glMatrixMode(GL10.GL_PROJECTION);
    	     gl.glLoadIdentity();
    	     GLU.gluPerspective(gl,45.0f, (float) w/(float) h, 3.0f, 7.0f);
    	     gl.glMatrixMode(GL10.GL_MODELVIEW);
    	     gl.glLoadIdentity();
    	     gl.glTranslatef(0.0f, 0.0f, -5.0f);
    }



    public void onDrawFrame(GL10 gl) {
    	 
    	   gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    	   /* draw blue sphere where the stencil is 1 */
    	   gl.glStencilFunc (GL10.GL_EQUAL, 0x1, 0x1);
    	   gl.glStencilOp (GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP);
    	     blueMat(gl);
    	      GLUT.glutSolidSphere (gl,0.5f, 15, 15);

    	   /* draw the tori where the stencil is not 1 */
    	      gl.glStencilFunc (GL10.GL_NOTEQUAL, 0x1, 0x1);
    	      gl.glPushMatrix();
    	      gl.glRotatef (45.0f, 0.0f, 0.0f, 1.0f);
    	      gl.glRotatef (45.0f, 0.0f, 1.0f, 0.0f);
    	        yellowMat(gl);
    	         GLUT.glutSolidTorus (gl,0.275f, 0.85f, 15, 15);
    	         gl.glPushMatrix();
    	         gl.glRotatef (90.0f, 1.0f, 0.0f, 0.0f);
    	            GLUT.glutSolidTorus (gl,0.275f, 0.85f, 15, 15);
    	            gl.glPopMatrix();
    	         gl.glPopMatrix();

    }



	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {setUpBuffers();
		int bits[]=new int[12];
		gl.glGetIntegerv(GL10.GL_STENCIL_BITS, bits, 0);
		Log.d("gl:","stencilbit="+bits[0]);//0 means no support?
		  


		   float position_one[] = { 1.0f, 1.0f, 1.0f, 0.0f };



		   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, FloatBuffer.wrap(position_one));

		   gl.glEnable(GL10.GL_LIGHT0);
		   gl.glEnable(GL10.GL_LIGHTING);
		   gl.glEnable(GL10.GL_DEPTH_TEST);

		   gl.glClearStencil(0x0);
		   gl.glEnable(GL10.GL_STENCIL_TEST);

	}



	


	
}


